#include <iostream>
#include <sstream>
#include <string>
using namespace std;

class Printable
{
public:
    virtual ~Printable() {};
    virtual void print(ostream &) const = 0;
};

class Intable
{
private:
public:
    virtual ~Intable() {};
    virtual int toInt() const = 0;
};

class Stringable
{
private:
public:
    virtual ~Stringable() {};
    virtual string toString() const = 0;
};

class Able:public Printable,public Intable,public Stringable
{
private:
    int mydata;
public:
    Able(int x){mydata = x;}
    void print(ostream& os) const{
        os << mydata;
    }
    int toInt() const {
        return mydata;
    }
    string toString() const{
        ostringstream os;
        os<< mydata;
        return os.str();
    } 
};

void testPrintable(const Printable& p){
    p.print(cout);
    cout<<endl;
 }

 void testIntable(const Intable& n){
     cout<< n.toInt()+1 <<endl;
 }

 void testStringable(const Stringable& s){
     cout << s.toString()+"th"<<endl;
 }

 int main(){
    Able a(7);
    testPrintable(a);
    testIntable(a);
    testStringable(a);
    return 0;
 }


